package authz;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import org.apache.shiro.authz.SimpleAuthorizationInfo;

public class CustomSimpleAuthorizationInfo extends SimpleAuthorizationInfo {

    private static final long serialVersionUID = 3544530620548612442L;

    /**
     * 添加(分配)一个权限给那些直接与该帐户相关的人。如果该帐户还没有任何直接的权限，一个新的权限集合（Set<String>）将被自动创建
     * <p>
     * 如果待添加的权限是既有权限集合中的某个权限的子串，并且前者与后者的前缀相同，那么前者将取代后者
     * <p>
     * 如果既有权限集合中的某个权限是待添加的权限的子串，并且前者与后者的前缀相同，那么后者将不会被添加至权限集合
     * <p>
     * 预添加的权限的第一个和最后一个字符不能是“:”
     * 
     * @param permission 要添加到直接分配给该帐户的权限
     */
    @Override
    public void addStringPermission(String permission) {
        int len = permission.length();
        if (permission.charAt(0) == ':' || permission.charAt(len - 1) == ':') {
            return;
        }
        if (this.stringPermissions == null) {
            this.stringPermissions = new HashSet<String>();
            this.stringPermissions.add(permission);
        } else if (this.stringPermissions.size() > 0) {
            List<String> permissions = new ArrayList<String>(this.stringPermissions);
            for (int i = 0; i < permissions.size(); i++) {
                String element = permissions.get(i);
                int elelen = element.length();
                if (permission.charAt(0) == ':') {
                    return;
                } else {
                    if (len > elelen) {
                        if (permission.indexOf(element) == 0) {
                            // 当前正在迭代的权限是待添加的权限的子串，子串之后的第一个字符是英文冒号“:”
                            if (permission.charAt(elelen) == ':') {
                                return;
                            }
                        } else if (i == this.stringPermissions.size() - 1) {
                            this.stringPermissions.add(permission);
                            break;
                        }
                    } else if (len < elelen) {
                        if (element.indexOf(permission) == 0) {
                            // 待添加的权限是当前正在迭代的权限的子串，子串之后的第一个字符是英文冒号“:”
                            if (element.charAt(len) == ':') {
                                this.stringPermissions.remove(element);
                                this.stringPermissions.add(permission);
                                return;
                            }
                        } else if (i == this.stringPermissions.size() - 1) {
                            this.stringPermissions.add(permission);
                            break;
                        }
                    } else {
                        if (!permission.equals(element)) {
                            this.stringPermissions.add(permission);
                            break;
                        }
                    }
                }
            }
        }
    }

}
